package startupcompanymanager2012.minigames.tictactoe;

/* TTT.java										   */
/* Hauptklasse fuer Tic Tac Toe mit Java AWT       */
/* benoetigt Java 1.2 oder hoeher                  */
/*                                                 */
/* (c) Thomas Duebendorfer, Juli 2000              */
/* Fuer Lehrzwecke frei verwendbar und anpassbar.  */
/* Kommerzielle Verwendung verboten.               */
/*                                                 */ 

import java.awt.*;
import java.awt.event.*;

public class TTT extends Frame implements ActionListener {
	//MenuItems deklarieren (fuer spaetere Bestimmung der Ereignis-Quelle)
	//private MenuItem neu, laden, speichern, beenden;
	//private MenuItem ueber;
	// NeuesSpielButton deklarieren
	private Button neuesSpielButton;
	// DropDownListe fuer Spielerauswahl deklarieren
	private Choice spielerChoice;
	
	// Die Felder sind von links oben nach rechts unten mit 0 bis 8 nummeriert
	public int[] spielfeld;
	// Reihenfolge der Spielfelder (Arrayindizes)
	//|0|1|2|
	//|3|4|5|
	//|6|7|8|
	// Codierung der Spielfeldeintraege
	public static final int SPIELER_X = 10, SPIELER_O = 1, LEER = 0, UNENTSCHIEDEN = -1, UNKLAR = 0;
	public int aktuellerSpieler, computerSpieler;
	public int anzahlGespielteZuege;
		
	public final static int BEREIT = 0;
	public final static int FERTIG = 1;
	public int status;

	public TTTBoard tttboard;

	TTT(String s) {
		// Konstruktor
		super(s);
		// Initialisierungen von Instanzvariablen
		spielfeld = new int[9];
		
		// GUI aufbauen - LayoutManager definieren
		setLayout(new BorderLayout());

		// Menu definieren
		// MenuBar erzeugen, Menus und MenuItems erzeugen
//		MenuBar mb = new MenuBar();
//		Menu spiel = new Menu("Spiel");
//		neu       = new MenuItem("Neu");
//		laden     = new MenuItem("Laden ...");
//		speichern = new MenuItem("Speichern ...");
//		beenden   = new MenuItem("Beenden");
//		
//		Menu hilfe = new Menu("?");
//		ueber = new MenuItem("�ber ...");
//
//		//Ereignisbehandlung hinzufuegen zu MenuItems
//		neu.addActionListener(this);
//		laden.addActionListener(this);
//		neu.addActionListener(this);
//		speichern.addActionListener(this);
//		beenden.addActionListener(this);
//		ueber.addActionListener(this);
//				
//		// Menupunkte zu Menus hinzufuegen
//		spiel.add(neu);
//		spiel.addSeparator();
//		spiel.add(laden);
//		spiel.add(speichern);
//		spiel.addSeparator();
//		spiel.add(beenden);
//		
//		hilfe.add(ueber);
//		
//		mb.add(spiel);
//		mb.add(hilfe);
//		setMenuBar(mb);

		// Board definieren
		tttboard = new TTTBoard(this);
 		add(tttboard, BorderLayout.CENTER);
		
		// DropDown-Liste, Neues-Spiel-Button definieren
		Panel horizPanel = new Panel(new BorderLayout());
		neuesSpielButton = new Button("Neues Spiel");
		
		// Ereignisbehandlung fuer NeuesSpielButton
		neuesSpielButton.addActionListener(this);
		horizPanel.add(neuesSpielButton, BorderLayout.EAST);
		
//		spielerChoice = new Choice();
//		spielerChoice.add("X beginnt");
//		spielerChoice.add("O beginnt");
//		spielerChoice.add("X beginnt gegen Computer");
//		spielerChoice.add("O beginnt gegen Computer");
//		horizPanel.add(spielerChoice, BorderLayout.WEST);
		add(horizPanel, BorderLayout.SOUTH);

		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}
	
	public static void main(String argv[]) {
		TTT ttt = new TTT("Tic Tac Toe");
		ttt.setSize(300, 350);
		ttt.neuesSpiel();
		ttt.setVisible(true);
	}	
	
	public int getAktuellerSpieler() {
		// gibt aktuellen Spieler zurueck
		return aktuellerSpieler;
	}
	
	public int getGegner(int aktuellerSpieler) {
		// gibt den Gegner zu 'aktuellerSpieler' zurueck
		if (aktuellerSpieler == SPIELER_X) 
			return SPIELER_O;
		else
			return SPIELER_X;
	}
	
	public void neuesSpiel() {
		// Initialisierungen, um ein neues Spiel beginnen zu koennen
		computerSpieler = 1; // kein ComputerSpieler als Standard
		anzahlGespielteZuege = 0;
		loescheSpielfeld();
		// Startspieler aus DropDown auslesen
		int aktuellerSpielerIndex = 2;
		if (aktuellerSpielerIndex == 0)      { aktuellerSpieler = SPIELER_X; }
		else if (aktuellerSpielerIndex == 1) { aktuellerSpieler = SPIELER_O; }
		else if (aktuellerSpielerIndex == 2) { aktuellerSpieler = SPIELER_X; computerSpieler = SPIELER_O; }
		else if (aktuellerSpielerIndex == 3) { aktuellerSpieler = SPIELER_O; computerSpieler = SPIELER_X; }
		status = BEREIT;
	}
	
	public void loescheSpielfeld() {
		// ganzes Spielfeld (inkl. GUI-Board) loeschen
		for (int i = 0; i < 9; i++) { 
			spielfeld[i] = 0;
			tttboard.setzeFeld(i,LEER);
		}
	}
	
	public int istSpielFertig() {
		// gibt Gewinner SPIELER_X  bzw. SPIELER_O zurueck
		// oder UNENTSCHIEDEN, falls UNENTSCHIEDEN ist
		// oder UNKLAR, falls Spiel noch nicht FERTIG ist
		int summe;
		
		// pruefe, ob es 3 gleiche Symbole in einer Zeile hat
		for (int i=0; i<=6; i = i + 3) {
			summe = spielfeld[i] +  spielfeld[i+1] +  spielfeld[i+2];
			if ((summe == 3) | (summe == 30))
				return summe/3;
		}
		
		// pruefe, ob es 3 gleiche Symbole in einer Spalte hat	
		for (int i=0; i<3; i++) {
			summe = spielfeld[i] +  spielfeld[i+3] +  spielfeld[i+6];
			if ((summe == 3) | (summe == 30))
				return summe/3;
		}

		// pruefe, ob es 3 gleiche Symbole in einer Diagonale hat	
		summe = spielfeld[0] +  spielfeld[4] +  spielfeld[8];
		if ((summe == 3) | (summe == 30))
				return summe/3;
		summe = spielfeld[6] +  spielfeld[4] +  spielfeld[2];
		if ((summe == 3) | (summe == 30))
				return summe/3;
		
		// pruefe, ob unentschieden ist oder ob das Spiel noch nicht fertig ist
		if (anzahlGespielteZuege == 9)
			return UNENTSCHIEDEN;
		else
			return UNKLAR;
	}
	
	public boolean macheZug(int feld) {
		// Fuehrt Zug auf Feld 'feld' aus und gibt 'true' zurueck bei Erfolg.
		// Wenn Zug nicht ausgefuehrt werden kann, wird 'false' zurueckgegeben.
		
		if (spielfeld[feld] == LEER && status != FERTIG) {
			// Zug erlaubt, deshalb ausfuehren
			spielfeld[feld] = aktuellerSpieler;
			tttboard.setzeFeld(feld,aktuellerSpieler);
			anzahlGespielteZuege++;
			
			// anschliessend kommt Gegner dran
			aktuellerSpieler = getGegner(aktuellerSpieler); 
			
			// pruefe, ob das Spiel fertig ist und wer u.U. der Sieger ist
			int resultat;
			if ((resultat = istSpielFertig()) != UNKLAR)	{
				String text;
				status = FERTIG;
					
				switch( resultat) {
					case SPIELER_X : text = new String("Spieler X hat gewonnen!"); break;
					case SPIELER_O: text = new String("Spieler O hat gewonnen!"); break;
					default: text = new String("Unentschieden!"); break;
				}			
				// Meldung ueber Resultat als Dialogbox anzeigen
				TTTDialog sieger = new TTTDialog(this, "Spielende", true, text, "OK");
				sieger.setVisible(true);
				return false;
			}
			
			// Erweiterung fuer Computer Spieler
			if (aktuellerSpieler == computerSpieler) {
				TTTComputerPlayer cs = new TTTComputerPlayer();
				macheZug(cs.besterZug(this));
			}				
			return true;
		}
		return false;
	}
	
	public void actionPerformed(ActionEvent e) {
//		// Menu- und Button-Ereignisse behandeln
		if (/*(e.getSource() == neu) |*/ (e.getSource() == neuesSpielButton)) { neuesSpiel(); }
//		if (e.getSource() == laden) { 
//			TTTFileIO io = new TTTFileIO();
//			io.spielLaden(this);
//		}
//		if (e.getSource() == speichern) { 
//			TTTFileIO io = new TTTFileIO();
//			io.spielSpeichern(this);	
//		}
//		if (e.getSource() == beenden) { System.exit(0); }
//		if (e.getSource() == ueber) { 
//				// Ueber-Dialog anzeigen
//				TTTDialog ueberDialog = new TTTDialog(this, "Ueber Tic Tac Toe ...", true, "(c) 2000, Thomas Duebendorfer", "OK");
//				ueberDialog.setVisible(true);
//		}
	}
}